package com.example.article.service;

import com.example.article.po.Comment;
import com.example.article.po.CommentCount;
import com.example.article.vo.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.GroupOperation;
import org.springframework.data.mongodb.core.aggregation.MatchOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class CommentService {

    //注入dao
    @Autowired
    private CommentRepository commentRepository;


    /**
     * 根据父id查询分页列表
     * @param parentid
     * @param page
     * @param size
     * @return
     */
    public Page<Comment> findCommentListPageByParentid(String parentid, int page , int size){
        return commentRepository.findByParentid(parentid, PageRequest.of(page-1,size));
    }


    /**
     * 根据父id查询分页列表(游标)
     * @param parentid
     * @return
     */
    public PageBean<Comment> findCommentListPageByParentid2(String parentid, int pageNum , int pageSize){

        //查询对象
        Query query= Query.query(Criteria.where("parentid").is(parentid));

        //查询数据总量
        long total = mongoTemplate.count(query, Comment.class, "comment");
        //计算总页数
        int totalPages = (int) Math.ceil((double) total / pageSize);


        List<Comment> commentList;

        // 通过 _id 来排序
        query.with(Sort.by(Sort.Direction.ASC, "_id"));

        if (pageNum != 1) {
            // number 参数是为了查上一页的最后一条数据
            int number = (pageNum - 1) * pageSize;
            query.limit(number);

            List<Comment> comments = mongoTemplate.find(query, Comment.class);
            // 取出最后一条
            Comment comment = comments.get(comments.size() - 1);

            // 取到上一页的最后一条数据 id，当作条件查接下来的数据
            String id = comment.getId();

            // 从上一页最后一条开始查（大于不包括这一条）
            query.addCriteria(Criteria.where("_id").gt(id));
        }
        // 页大小重新赋值，覆盖 number 参数
        query.limit(pageSize);
        // 即可得到第n页数据
        commentList = mongoTemplate.find(query, Comment.class);

        return new PageBean<Comment>((int) total,totalPages,pageNum,pageSize,commentList);
    }

    /**
     * 保存一个评论
     * @param comment
     */
    public void saveComment(Comment comment){
        //如果需要自定义主键，可以在这里指定主键；如果不指定主键，MongoDB会自动生成主键
        //设置一些默认初始值。。。
        //调用dao
        commentRepository.save(comment);
    }
    /**
     * 更新评论
     * @param comment
     */
    public void updateComment(Comment comment){
        //调用dao
        commentRepository.save(comment);
    }
    /**
     * 根据id删除评论
     * @param id
     */
    public void deleteCommentById(String id){
        //调用dao
        commentRepository.deleteById(id);
    }
    /**
     * 查询所有评论
     * @return
     */
    public List<Comment> findCommentList(){
        //调用dao
        return commentRepository.findAll();
    }
    /**
     * 根据id查询评论
     * @param id
     * @return
     */
    public Comment findCommentById(String id){
        //调用dao
        return commentRepository.findById(id).get();
    }

    /**
     * 点赞-效率低
     * @param id
     */
    public void updateCommentThumbupToIncrementingOld(String id){
        Comment comment = commentRepository.findById(id).get();
        comment.setLikenum(comment.getLikenum()+1);
        commentRepository.save(comment);
    }


    //注入MongoTemplate
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 点赞数+1
     * @param id
     */
    public void updateCommentLikenum(String id){
        //查询对象
        Query query= Query.query(Criteria.where("_id").is(id));
        //更新对象
        Update update=new Update();
        //局部更新，相当于$set
        // update.set(key,value)
        //递增$inc
        // update.inc("likenum",1);
        update.inc("likenum");
        //参数1：查询对象
        //参数2：更新对象
        //参数3：集合的名字或实体类的类型Comment.class
        mongoTemplate.updateFirst(query,update,"comment");
    }


    /**
     * 聚合查询
     * @return
     */
    public List<CommentCount> searchAllSample() {
        // 构建聚合管道阶段
        MatchOperation matchStage = Aggregation.match(Criteria.where("userid").is("1003"));
        GroupOperation groupStage = Aggregation.group("nickname")
                .sum("likenum").as("fieldN");

        // 构建聚合对象
        Aggregation aggregation = Aggregation.newAggregation(matchStage, groupStage);

        // 执行聚合查询
        List<CommentCount> results = mongoTemplate.aggregate(aggregation, "comment", CommentCount.class).getMappedResults();
        return results;
    }





}
